﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EntitiesLayer;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using DAL.Repositories;
using DAL.AbstractRepositories;

namespace DAL.Repositorios
{
    /// <summary>
    /// Repositorio el CRUD de las imagenes de un ejercicio. 
    /// </summary>
    public class ImagenRepository : AbstractRepository<Imagen>
    {

        public override void Insert(Imagen entity)
        {
            Inserted.Add(entity);
        }

        public override void Delete(Imagen entity)
        {
            Deleted.Add(entity);
        }

        public override void Update(Imagen entity)
        {
            Updated.Add(entity);
        }

        public override IEnumerable<Imagen> GetAll()
        {
            IList<Imagen> lista = new List<Imagen>();
            SqlCommand cmd = new SqlCommand();
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaListarImagenes");

            foreach (DataRow dr in ds.Tables[0].Rows)
                lista.Add(crearImagen(dr.Field<int>("IdFoto"), dr));

            return lista;
        }

        public override Imagen GetById(int id)
        {
            Imagen imagen = null;
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.Add(new SqlParameter("@IdFoto", id));
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaConsultarImagenXId");

            foreach (DataRow dr in ds.Tables[0].Rows)
                imagen = crearImagen(dr.Field<int>("IdFoto"), dr);
               
            

            return imagen;
        }

        protected override void InsertEntity(Imagen i) {

                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdEjercicio", i.IdEjercicio));
                cmd.Parameters.Add(new SqlParameter("@Descripcion", i.Descripcion));
                cmd.Parameters.Add(new SqlParameter("@Foto", i.BitImagen.ToByte()));
                DBAccess.ExecuteSPNonQuery(ref cmd, "PaRegistrarImagen");

            
        }

        protected override void UpdateEntity(Imagen i) {

                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdEjercicio", i.IdEjercicio));
                cmd.Parameters.Add(new SqlParameter("@Descripcion", i.Descripcion));
                DBAccess.ExecuteSPNonQuery(ref cmd, "PaModificarImagen");

        }

        protected override void DeleteEntity(Imagen i) {
          
                SqlCommand cmd = new SqlCommand();
                cmd.Parameters.Add(new SqlParameter("@IdFoto", i.Id));
                DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaEliminarImagenes");
          
        }

        public static Imagen crearImagen(int id , DataRow dr) {

            object foto = dr["Foto"];

            return new Imagen(
              idEjercicio: dr.Field<int>("IdEjercicio"),
              bitImagen: foto != DBNull.Value ? ((byte[])foto).toBitMap() : null,
              descripcion: dr["Descripcion"].ToString(),
              idImagen: id
            );
        }
    

        public IList<Imagen> imagenDeEjercicio(int idEjercicio) {
            

            IList<Imagen> imagenes = new List<Imagen>();
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.Add(new SqlParameter("@IdEjercicio", idEjercicio));
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "PaListarImagenesEjercicio");

            foreach (DataRow dr in ds.Tables[0].Rows)
                imagenes.Add(crearImagen(dr.Field<int>("IdFoto"), dr));
               
            return imagenes.Count>0? imagenes: null;
            
        }
    }
}
